home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / msysjour / vol06 / 05 / sysseg / sysseg.c < prev    next >
C/C++ Source or Header  |  1991-09-01  |  9KB  |  243 lines

  1. /*-------------------------------------------------------------*\
  2.  |   SYSSEG.C  -- Creates two iconized windows to monitor     |
  3.  |                 the available heap space for USER and GDI.  |
  4. \*-------------------------------------------------------------*/
  5. #include <Windows.H>
  6.  
  7. #define MAXDOSERROR 32
  8.  
  9. /*-------------------------------------------------------------*\
  10.  |                    Function Prototypes.                     |
  11. \*-------------------------------------------------------------*/
  12. long FAR  PASCAL SysSegWndProc (HWND, WORD, WORD, LONG);
  13.  
  14.  
  15. /*-------------------------------------------------------------*\
  16.  |                    Global Variables.                        |
  17. \*-------------------------------------------------------------*/
  18. HWND hwnd1;
  19. HWND hwnd2;
  20.  
  21. /*-------------------------------------------------------------*\
  22.  |                  Main Function:  WinMain.                   |
  23. \*-------------------------------------------------------------*/
  24. int PASCAL WinMain (HANDLE hInstance,   HANDLE hPrevInstance,
  25.                     LPSTR  lpszCmdLine, int    cmdShow)
  26.     {
  27.     MSG      msg;
  28.     WNDCLASS wndclass;
  29.  
  30.     if (!hPrevInstance)
  31.         {
  32.         wndclass.lpszClassName = "SysSeg:MAIN";
  33.         wndclass.hInstance     = hInstance;
  34.         wndclass.lpfnWndProc   = SysSegWndProc;
  35.         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
  36.         wndclass.hIcon         = 0;
  37.         wndclass.lpszMenuName  = NULL;
  38.         wndclass.hbrBackground = COLOR_WINDOW+1;
  39.         wndclass.style         = NULL;
  40.         wndclass.cbClsExtra    = 0;
  41.         wndclass.cbWndExtra    = 2;
  42.  
  43.         RegisterClass( &wndclass);
  44.         }
  45.  
  46.     hwnd1= CreateWindow("SysSeg:MAIN",       /* Class name.   */
  47.                         "GDI",                /* Title.        */
  48.                         WS_OVERLAPPEDWINDOW,  /* Style bits.   */
  49.                         0,                    /* x - default.  */
  50.                         0,                    /* y - default.  */
  51.                         0,                    /* cx - default. */
  52.                         0,                    /* cy - default. */
  53.                         NULL,                 /* No parent.    */
  54.                         NULL,                 /* Class menu.   */
  55.                         hInstance,            /* Creator.      */
  56.                         NULL);                /* Params.       */
  57.  
  58.     // Set timer to check every second.
  59.     SetTimer (hwnd1, 1, 1000, 0L);
  60.  
  61.     hwnd2= CreateWindow("SysSeg:MAIN",       /* Class name.   */
  62.                         "USER",               /* Title.        */
  63.                         WS_OVERLAPPEDWINDOW,  /* Style bits.   */
  64.                         0,                    /* x - default.  */
  65.                         0,                    /* y - default.  */
  66.                         0,                    /* cx - default. */
  67.                         0,                    /* cy - default. */
  68.                         NULL,                 /* No parent.    */
  69.                         NULL,                 /* Class menu.   */
  70.                         hInstance,            /* Creator.      */
  71.                         NULL);                /* Params.       */
  72.  
  73.     ShowWindow (hwnd1, SW_SHOWMINIMIZED);
  74.     ShowWindow (hwnd2, SW_SHOWMINIMIZED);
  75.  
  76.     while (GetMessage(&msg, 0, 0, 0))
  77.         {
  78.         TranslateMessage(&msg);       /*  Keyboard input.      */
  79.         DispatchMessage(&msg);
  80.         }
  81.     return 0;
  82.     }
  83.  
  84.  
  85. /*-------------------------------------------------------------*\
  86.  |            Window Procedure:  SysSegWndProc.               |
  87. \*-------------------------------------------------------------*/
  88. long FAR PASCAL SysSegWndProc (HWND hwnd,   WORD wMsg,
  89.                                 WORD wParam, LONG lParam)
  90.     {
  91.     static HANDLE hbrNull;
  92.  
  93.     switch (wMsg)
  94.         {
  95.         case WM_CREATE:
  96.             {
  97.             char           achLibName[50];
  98.             char           achTitle[50];
  99.             HANDLE         hLib;
  100.             LPCREATESTRUCT lpcreate;
  101.  
  102.             // Create library names USER.EXE and GDI.EXE
  103.             lpcreate = (LPCREATESTRUCT)lParam;
  104.             lstrcpy (achLibName, lpcreate->lpszName);
  105.             lstrcat (achLibName, ".EXE");
  106.  
  107.             // Try getting handle to library.
  108.             hLib = LoadLibrary (achLibName);
  109.             FreeLibrary (hLib);
  110.  
  111.             // Did we fail?
  112.             if (hLib < MAXDOSERROR)
  113.                 {
  114.                 MessageBox (hwnd, "Cannot load library",
  115.                             "SysSeg", 0);
  116.                 return -1L;
  117.                 }
  118.  
  119.             /*
  120.              *  Create a nicer window title.
  121.              */
  122.             lstrcpy (achTitle, lpcreate->lpszName);
  123.             lstrcat (achTitle, " Data Seg");
  124.             SendMessage (hwnd, WM_SETTEXT, 0, (LONG)(LPSTR)achTitle);
  125.  
  126.             // Place segment handle in window extra bytes.
  127.             SetWindowWord (hwnd, 0, hLib);
  128.  
  129.             hbrNull = GetStockObject (NULL_BRUSH);
  130.             }
  131.             break;
  132.  
  133.         case WM_DESTROY:
  134.             PostQuitMessage(0);
  135.             break;
  136.  
  137.         case WM_ERASEBKGND:
  138.             return 1L;
  139.             break;
  140.  
  141.         case WM_QUERYOPEN:
  142.             /*
  143.              *  If someone knocks, ignore them.  Don't open
  144.              *  the iconized window.
  145.              */
  146.             return 0L;
  147.             break;
  148.  
  149.         case WM_PAINT:
  150.             {
  151.             char        ach[50];
  152.             DWORD       dwSize;
  153.             DWORD       dwSegment;
  154.             HANDLE      hLib;
  155.             int         cb;
  156.             int         iPercent;
  157.             int         xWidth, yHeight;
  158.             int         X, Y;
  159.             PAINTSTRUCT ps;
  160.             RECT        rClient;
  161.             RECT        rOpaque;
  162.             RECT        rPlain;
  163.  
  164.             BeginPaint (hwnd, &ps);
  165.  
  166.             // Get size of segment.
  167.             hLib = GetWindowWord (hwnd, 0);
  168.             dwSegment = GlobalSize (hLib);
  169.  
  170.             // Calculate percent
  171.             iPercent = (int)(dwSegment/655);
  172.             cb = wsprintf (ach, "%d%%", iPercent);
  173.  
  174.             // Get dimensions of text.
  175.             dwSize  = GetTextExtent (ps.hdc, ach, cb);
  176.             xWidth  = LOWORD (dwSize);
  177.             yHeight = HIWORD (dwSize);
  178.  
  179.             // Position text in center of icon.
  180.             GetClientRect (hwnd, &rClient);
  181.             X = (rClient.right  / 2) - (xWidth  / 2);
  182.             Y = (rClient.bottom / 2) - (yHeight / 2);
  183.  
  184.             // Draw bounding rectangle.
  185.             SelectObject (ps.hdc, hbrNull);
  186.             Rectangle (ps.hdc, rClient.left, rClient.top,
  187.                                rClient.right, rClient.bottom);
  188.  
  189.             // Adjust Rectangle for filling.
  190.             rClient.left++;
  191.             rClient.top ++;
  192.             rClient.right --;
  193.             rClient.bottom--;
  194.  
  195.             // Change from 'percent full' to 'percent empty'.
  196.             iPercent = 100 - iPercent;
  197.  
  198.             /*
  199.              * Calculate rectangles.
  200.              *
  201.              *     -----------------   Bottom of rPlain is
  202.              *     |               |   same as top of rOpaque.
  203.              *     |    rPlain     |            |
  204.              *     |               |            |
  205.              *     |---------------| <----------|
  206.              *     |               |
  207.              *     |    rOpaque    |
  208.              *     |               |
  209.              *     |---------------|
  210.              */
  211.             rPlain  = rClient;
  212.             rOpaque = rClient;
  213.             rPlain.bottom = rOpaque.top =
  214.                 ((rClient.bottom - rClient.top) * iPercent) / 100;
  215.  
  216.             // Draw string, with plain rectangle first.
  217.             SetBkColor (ps.hdc, RGB (255, 255, 255));
  218.             SetTextColor (ps.hdc, RGB (255, 0, 0));
  219.             ExtTextOut (ps.hdc, X, Y, ETO_OPAQUE | ETO_CLIPPED,
  220.                         &rPlain, ach, cb, 0);
  221.  
  222.             // Draw string, with opaqued rectangle.
  223.             SetBkColor (ps.hdc, RGB (255, 0, 0));
  224.             SetTextColor (ps.hdc, RGB (255, 255, 255));
  225.             ExtTextOut (ps.hdc, X, Y, ETO_OPAQUE | ETO_CLIPPED,
  226.                         &rOpaque, ach, cb, 0);
  227.  
  228.             EndPaint (hwnd, &ps);
  229.             }
  230.             break;
  231.  
  232.         case WM_TIMER:
  233.             InvalidateRect (hwnd1, NULL, FALSE);
  234.             InvalidateRect (hwnd2, NULL, FALSE);
  235.             break;
  236.  
  237.         default:
  238.             return(DefWindowProc(hwnd,wMsg,wParam,lParam));
  239.             break;
  240.         }
  241.     return 0L;
  242.     }
  243.